package com.jacob.androidstudy.javanote;

/**
 * 枚举：
 * 1.一个类型的值只有有限的几个，就是枚举类型。（例如星期、季节等）
 * 2.枚举实际上就是一个特殊的class。枚举值就是枚举类型的对象。
 * 3.枚举也可以有属性和方法，这点和一般的class相同。
 * 4.所有枚举都继承于java.lang.Enum，所有枚举都可以使用java.lang.Enum的方法。
 * 
 */
public enum $21_枚举 {
	
	/**
	 * 枚举值列表
	 * 1.此列表就表示枚举的对象，列表中有多少个枚举值，枚举就只能有多少个对象。
	 * 2.枚举被加载时，会自动调用构造方法，按照枚举值列表实例化对象。
	 * 3.枚举值都是public static final的。
	 * 4.调用枚举的枚举值，使用“枚举.枚举值”的方式。
	 * 5.若枚举中定义了抽象方法，在枚举值列表中必须给出实现。此时枚举值被实例化后，实际上是枚举类型的一个匿名子内部类。
	 */
	ENUM1 { //没有参数，就调用无参构造。
		@Override
		public void m() { //若枚举中定义了抽象方法，在枚举值列表中必须给出实现。
			System.out.println("ENUM1");
		}
	},
	ENUM2("枚举值2") { //有一个String参数，就调用对应的有参构造。
		@Override
		public void m() { //若枚举中定义了抽象方法，在枚举值列表中必须给出实现。
			System.out.println("ENUM2");
		}
	};
	
	
	/**
	 * 枚举的构造器
	 * 1.枚举构造器必须写在枚举值列表的后面。
	 * 2.枚举构造器的访问权限只能是默认的，或者private的。
	 * 3.枚举构造器只是在构造枚举值的时候被调用。
	 * 
	 */
	$21_枚举() {
		this.name = "默认值";
	}
	private $21_枚举(String name) {
		this.name = name;
	}
	
	
	/**
	 * 枚举的属性和方法
	 * 1.枚举的属性和方法必须写在枚举值列表的后面。
	 * 2.枚举类通常应该设计成不可变类，所以属性就应该是private final的。同时只提供get()即可。
	 * 3.枚举的方法也可以是abstract的，但是此时就必须在枚举值列表中，给出方法实现。
	 */
	private final String name;
	public abstract void m();

}
